import os
import glob
import logging
from logging.handlers import RotatingFileHandler
from config.config import config

class LogTheme:
    SYMBOL = '\033[1;36m'  # 青色加粗
    DATE = '\033[34m'      # 蓝色
    NUMERIC = '\033[33m'   # 黄色
    RESET = '\033[0m'

def clean_old_logs(log_path: str) -> None:
    """
    清理所有历史日志文件（包括轮换文件）
    :param log_path: 主日志文件路径（如 logs/app.log）
    """
    try:
        # 获取日志目录和基本文件名
        log_dir = os.path.dirname(log_path)
        base_name = os.path.basename(log_path)

        # 匹配所有相关日志文件（如 app.log, app.log.1, app.log.2.gz 等）
        pattern = os.path.join(log_dir, f"{base_name}*")
        old_logs = glob.glob(pattern)

        # 删除文件
        for f in old_logs:
            try:
                os.remove(f)
                print(f"已删除旧日志文件: {f}")  # 调试用，正式环境可注释
            except Exception as e:
                print(f"删除日志文件失败 {f}: {str(e)}")

    except Exception as e:
        print(f"清理日志异常: {str(e)}")

def setup_logger() -> logging.Logger:
    """
    初始化日志记录器（每次启动清理旧日志）
    :param config: 日志配置
    :return: 配置好的Logger实例
    """
    mode = config.get('mode')

    # 清理旧日志
    if mode == 'backtest':
        log_path = config.get('logging.backtest_file_path')
        if log_path:
            clean_old_logs(log_path)
    elif mode == 'livetest':
        log_path = config.get('logging.livetest_file_path')
        if log_path:
            clean_old_logs(log_path)
    elif mode == 'optimize':
        log_path = config.get('logging.optimize_file_path')
    else:
        log_path = config.get('logging.live_file_path')

    # 创建日志目录
    log_dir = os.path.dirname(log_path)
    os.makedirs(log_dir, exist_ok=True)

    name = config.get('logging.name')

    logger = logging.getLogger(name)
    logger.setLevel('INFO')  # 根logger设置为最低级别

    # 删除所有Handler
    for handler in logger.handlers[:]:  # 通过切片遍历所有处理器
        handler.close()  # 如果需要关闭文件处理器等
        logger.removeHandler(handler)

    # 文件日志（按大小轮换）
    file_handler = RotatingFileHandler(
        filename=log_path,
        maxBytes=100*1024*1024,  # 100MB
        backupCount=5,
        encoding='utf-8'
    )

    file_formatter = logging.Formatter('%(asctime)s - %(name)-14s - %(levelname)-8s - %(message)s')
    # file_formatter = logging.Formatter('%(levelname)-7s - %(message)s')
    file_handler.setFormatter(file_formatter)

    # 控制台日志
    console_handler = logging.StreamHandler()

    if mode == 'optimize':
        console_handler.setLevel('WARNING')
        file_handler.setLevel('WARNING')
    else:
        console_handler.setLevel(config.get('logging.level'))

    #console_formatter = logging.Formatter('%(name)-14s - %(levelname)-7s - %(message)s')
    console_formatter = logging.Formatter('%(asctime)s - %(name)-14s - %(levelname)-8s - %(message)s')
    console_handler.setFormatter(console_formatter)

    logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    return logger

def close_logger() -> None:
    """
    安全关闭Logger并释放所有文件句柄
    :param target_logger: 要关闭的Logger实例
    """
    name = config.get('logging.name')

    logger = logging.getLogger(name)

    # 删除所有Handler
    for handler in logger.handlers[:]:  # 通过切片遍历所有处理器
        handler.close()  # 如果需要关闭文件处理器等
        logger.removeHandler(handler)

    # 释放logging模块全局资源
    logging.shutdown()

close_logger()
sys_logger = setup_logger()